/*
 * Copyright (C) 2010 恒康信息科技有限公司
 * 版权所有
 */
package com.jjmmbb.anydolist;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.http.util.EncodingUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.text.format.DateFormat;
import android.util.Log;

import com.jjmmbb.db.db.ItemManager;
import com.jjmmbb.db.pojo.Item;

public class UtilFile {
	public static String FilePath = "jjmmbb/DoList";
	public static String FileName = "DB.bak";
	public static String FileName_txt = "DB.txt";
	static String data_sp = "-@!@#@7@-";

	// 保存到文本用于备份
	public static boolean saveToFile(ItemManager im) {
		return saveToFile(FileName, im);
	}

	// 保存到文本用于,以字符串形式
	public static boolean saveToFile_txt(ItemManager im) {
		return saveToFile(FileName_txt, im);
	}

	// 从数据库组装数据,用于备份,sql
	static String getDBString(ItemManager im) {
		StringBuffer sb = new StringBuffer();
		ArrayList<Item> list = im.getListOrder();
		for (Item item : list) {
			String title = item.title;
			int type = item.type;
			String time = item.time;
			sb.append("'").append(title).append("',");
			sb.append(type).append(",");
			sb.append("'").append(time).append("'" + data_sp);
		}
		return sb.toString();
	}

	// 从数据库组装数据,用于备份,json
	private static String getDBJsonString(ItemManager im) {
		JSONObject jsonStr = null;
		try {
			jsonStr = new JSONObject();
			jsonStr.put("BackupType", "json");

			JSONArray jsonArr = new JSONArray(); // 组装数组

			ArrayList<Item> list = im.getListOrder();
			for (Item item : list) {
				JSONObject jsonItem = new JSONObject();
				String title = item.title;
				int type = item.type;
				String time = item.time;
				int typeAlarm = item.typeAlarm;
				String team = item.team;
				long timeAlarm = item.timeAlarm;

				jsonItem.put("title", title);
				jsonItem.put("type", type);
				jsonItem.put("time", time);
				jsonItem.put("typeAlarm", typeAlarm);
				jsonItem.put("team", team);
				jsonItem.put("timeAlarm", timeAlarm);

				jsonArr.put(jsonItem); // 加入数组
			}
			jsonStr.put("List", jsonArr);// 添加list到文本

		} catch (JSONException e) {
			e.printStackTrace();
		}// 备份文本

		return jsonStr.toString();
	}

	// 从json字符串恢复数据到数据库
	private static void restoreFromJsonStr(String jsonStr, ItemManager im) {
		JSONObject objALL = null;
		try {
			objALL = new JSONObject(jsonStr);

			JSONArray objArr = objALL.optJSONArray("List");
			int itemLength = objArr.length();
			for (int i = 0; i < itemLength; i++) {
				JSONObject obj = objArr.optJSONObject(i);
				Item item = new Item();
				item.title = obj.optString("title");
				item.type = obj.optInt("type");
				item.team = obj.optString("team");
				item.typeAlarm = obj.optInt("typeAlarm");
				item.time = obj.optString("time");
				item.timeAlarm = obj.optLong("timeAlarm");
				item.save(im);
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}
	}

	// 从数据库组装数据,组装为普通文本
	static String getDBString_txt(ItemManager im) {
		StringBuffer sb = new StringBuffer();
		ArrayList<Item> list = im.getListOrder();
		for (Item item : list) {
			String title = item.title;
			sb.append(title).append("\n");
		}
		return sb.toString();
	}

	// 从备份文件恢复
	public static boolean restoreFromFile(ItemManager im) {
		if (!haveSdcard()) {
			return false;
		}
		String dir = sdcardPath + "/" + FilePath;

		// 目录不存在
		File homedir = new File(dir);
		if (!homedir.exists()) {
			return false;
		}

		String data = "";
		try {
			File fileBak = new File(dir, FileName);
			FileInputStream fin = new FileInputStream(fileBak);
			int length = fin.available();
			byte[] buffer = new byte[length];
			fin.read(buffer);
			data = EncodingUtils.getString(buffer, "utf-8");
			fin.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 解析数据,插入数据库
		if (null == data || "".equals(data)) {
			return false;
		} else {
			if (null == isJsonStr(data)) {
				String[] dataArray = data.split(data_sp);
				for (String d : dataArray) {
					if (null == d || "".equals(d)) {
					} else {
						im.insert4Restore(d);
					}
				}
			} else {
				restoreFromJsonStr(data, im);
			}
		}
		return true;
	}

	// 判断是否json字符串
	private static JSONObject isJsonStr(String jsonStr) {
		JSONObject objALL = null;
		try {
			objALL = new JSONObject(jsonStr);
		} catch (JSONException e) {
			e.printStackTrace();
			return null;
		}
		return objALL;
	}

	// 保存到备份文件或者文本文件
	private static boolean saveToFile(String fileName, ItemManager im) {
		if (!haveSdcard()) {
			return false;
		}
		String dir = sdcardPath + "/" + FilePath;

		// 目录不存在则创建目录
		File homedir = new File(dir);
		if (!homedir.exists()) {
			if (!homedir.mkdirs()) {
				return false;
			}
		}

		// 将数据库备份写入文件
		File fileBak = new File(dir, fileName);
		FileOutputStream writer = null;
		String dataStr;
		if (FileName_txt.equals(fileName)) {
			dataStr = getDBString_txt(im); // 从数据库组装数据
		} else {
			// dataStr = getDBString(im); // 从数据库组装数据sql
			dataStr = getDBJsonString(im); // 从数据库组装数据json
		}
		try {
			byte[] dataByte = dataStr.getBytes("utf-8");
			writer = new FileOutputStream(fileBak);
			writer.write(dataByte);
			writer.close();
		} catch (IOException e) {
			return false;
		}
		// 按时间做一个备份
		String time = (String) DateFormat.format("yyMMddhhmmss", new Date());
		File fileBakTime = new File(dir, fileName + time);
		try {
			byte[] dataByte = dataStr.getBytes("utf-8");
			writer = new FileOutputStream(fileBakTime);
			writer.write(dataByte);
			writer.close();
		} catch (IOException e) {
			return false;
		}
		return true;
	}

	// ***************************以下是标准工具***************************************//
	public static String sdcardPath = Environment.getExternalStorageDirectory()
			.getPath();

	/**
	 * 在sdcard下面创建目录
	 * 
	 * @param dir
	 * @return
	 */
	public static boolean createDirInSdcard(String dir) {

		if (!haveSdcard()) {
			return false;
		}
		String dirPath = sdcardPath + "/" + dir;

		File homedir = new File(dirPath);

		boolean flag = false;
		if (homedir.exists()) {
			Log.d("FileUtil", "目录已经存在");
			return true;
		} else {
			flag = homedir.mkdirs(); // 创建目录
			if (flag)
				return true;
			else
				return false;
		}

	}

	/**
	 * 创建图片文件到sdcard
	 */
	public static boolean saveImageInSdcard(String dir, String filename,
			Bitmap bitmap) {
		if (null == bitmap) {
			return false;
		}
		if (!haveSdcard()) {
			return false;
		}
		dir = sdcardPath + "/" + dir;

		// 目录不存在则创建目录
		File homedir = new File(dir);
		if (!homedir.exists()) {
			if (!homedir.mkdirs()) {
				return false;
			}
		}

		File bitmapFile = new File(dir, filename);
		FileOutputStream bitmapWtriter = null;
		try {
			bitmapWtriter = new FileOutputStream(bitmapFile);
			if (bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bitmapWtriter)) {
				bitmapWtriter.flush();
				bitmapWtriter.close();
				return true;
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * 根据绝对路径获取图片
	 * 
	 * @param dir
	 * @return
	 */
	public static Bitmap getImage(String path) {
		return BitmapFactory.decodeFile(path);
	}

	/**
	 * 根据相对路径获取sdcard中的图片
	 * 
	 * @param dir
	 * @return
	 */
	public static Bitmap getImageInSdcard(String path) {
		String pathName = sdcardPath + "/" + path;
		return BitmapFactory.decodeFile(pathName);
	}

	/**
	 * 根据相对路径获取sdcard中图片的缩略图
	 * 
	 * @param filePath
	 *            相对文件路径
	 * @param height
	 *            图片显示高度 height=0时使用默认值80
	 * @return
	 */
	public static Bitmap getThumbnailInSdcard(String filePath, int height) {
		if (0 == height)
			height = 80;
		String path = sdcardPath + "/" + filePath;
		BitmapFactory.Options options = new BitmapFactory.Options();

		// 获取这个图片的宽和高
		options.inJustDecodeBounds = true; // true 则返回bm为空
		Bitmap bitmap = BitmapFactory.decodeFile(path, options); // 此时返回bm为空,
																	// 只读大小,不耗内存,
		// 计算缩放比 节省内存
		int be = (int) (options.outHeight / (float) height);
		if (be <= 0)
			be = 1;
		options.inSampleSize = be;
		// 重新读入图片，注意这次要把options.inJustDecodeBounds 设为 false哦
		options.inJustDecodeBounds = false;
		bitmap = BitmapFactory.decodeFile(path, options);
		if (null == bitmap)
			return null;
		return bitmap;
	}

	/**
	 * 根据绝对路径获取图片的缩略图
	 * 
	 * @param filePath
	 *            相对文件路径
	 * @param height
	 *            图片显示高度 height=0时使用默认值80
	 * @return
	 */
	public static Bitmap getThumbnail(String path, int height) {
		if (0 == height)
			height = 80;
		BitmapFactory.Options options = new BitmapFactory.Options();

		// 获取这个图片的宽和高
		options.inJustDecodeBounds = true; // true 则返回bm为空
		Bitmap bitmap = BitmapFactory.decodeFile(path, options); // 此时返回bm为空,
																	// 只读大小,不耗内存,
		// 计算缩放比 节省内存
		int be = (int) (options.outHeight / (float) height);
		if (be <= 0)
			be = 1;
		options.inSampleSize = be;
		// 重新读入图片，注意这次要把options.inJustDecodeBounds 设为 false哦
		options.inJustDecodeBounds = false;
		bitmap = BitmapFactory.decodeFile(path, options);
		int w = bitmap.getWidth();
		int h = bitmap.getHeight();
		Log.d("ia", w + "   " + h);
		return bitmap;
	}

	/**
	 * 获取sdcard下某目录内的图片,不迭代子目录
	 * 
	 * @param dir
	 *            相对于sdcard的目录
	 * @return
	 */
	public static List<String> getImagesInSdcardDir(String dir) {
		/* 设定目前所在路径 */
		List<String> it = new ArrayList<String>();
		File f = new File(sdcardPath + "/" + dir);
		File[] files = f.listFiles();

		/* 将所有文件存入ArrayList中 */
		if (null == files)
			return null;
		for (int i = 0; i < files.length; i++) {
			File file = files[i];
			if (isImage(file.getPath()))
				it.add(file.getPath());
		}
		return it;
	}

	/**
	 * 获取sdcard下某目录内的图片,包括子目录
	 * 
	 * @param dir
	 *            相对于sdcard的目录
	 * @return
	 */
	public static List<String> getAllImageInSdcardDir(String dir) {
		/* 设定目前所在路径 */
		List<String> it = new ArrayList<String>();
		File f = new File(sdcardPath + "/" + dir);
		File[] files = f.listFiles();

		/* 将所有文件存入ArrayList中 */
		for (int i = 0; i < files.length; i++) {
			File file = files[i];
			if (isImage(file.getPath()))
				it.add(file.getPath());
		}
		return it;
	}

	/**
	 * 获取sdcard下面的所有图片
	 * 
	 * @return
	 */
	public static List<String> getAllImageInSdcard() {
		/* 设定目前所在路径 */
		List<String> it = new ArrayList<String>();
		File f = new File(sdcardPath);
		File[] files = f.listFiles();

		/* 将所有文件存入ArrayList中 */
		for (int i = 0; i < files.length; i++) {
			File file = files[i];
			if (isImage(file.getPath()))
				it.add(file.getPath());
		}
		return it;
	}

	/**
	 * 用绝对sdcard的路径删除文件
	 * 
	 * @param dir
	 * @return
	 */
	public static boolean deleteFileInSdcard(String path) {

		File file = new File(sdcardPath + "/" + path);

		boolean flag = false;
		if (file.exists()) {
			flag = file.delete();
			if (flag) {
				Log.d("FileUtil", "文件删除成功");
				return true;
			} else {
				Log.d("FileUtil", "文件删除失败");
				return false;
			}

		} else {
			Log.d("FileUtil", "文件不存在");
			return false;
		}
	}

	/**
	 * 用绝对路径删除文件
	 * 
	 * @param dir
	 * @return
	 */
	public static boolean deleteFile(String path) {

		File file = new File(path);

		boolean flag = false;
		if (file.exists()) {
			flag = file.delete();
			if (flag) {
				Log.d("FileUtil", "文件删除成功");
				return true;
			} else {
				Log.d("FileUtil", "文件删除失败");
				return false;
			}

		} else {
			Log.d("FileUtil", "文件不存在");
			return false;
		}
	}

	/**
	 * 过滤图片文件,判断传入的文件名是否是图片后缀结尾
	 * 
	 * @param fName
	 * @return
	 */
	public static boolean isImage(String fName) {
		boolean re;

		/* 取得扩展名 */
		String end = fName
				.substring(fName.lastIndexOf(".") + 1, fName.length())
				.toLowerCase();

		/* 按扩展名的类型决定MimeType */
		if (end.equals("jpg") || end.equals("gif") || end.equals("png")
				|| end.equals("jpeg") || end.equals("bmp")) {
			re = true;
		} else {
			re = false;
		}
		return re;
	}

	/**
	 * 判断是否插入SDcard
	 * 
	 */
	public static boolean haveSdcard() {
		String status = Environment.getExternalStorageState();
		if (status.equals(Environment.MEDIA_MOUNTED)) {
			return true;
		} else {
			return false;
		}
	}
}
